#ifndef IPC_CLIENT_H
#define IPC_CLIENT_H

#include "ipc_data.h"

namespace ipc
{
	// 服务器数据监听器(接口)
	class IServerObserver
	{
	public:
		// 服务器发送了监听的数据过来
		virtual void onUpdate(Bundle& data) = 0;
	};
	
	// 服务连接监听器
	class IServiceConnectionListener
	{
	public:
		// 服务连接上了
		virtual void onConnected(const std::string& serviceName) = 0;
		
		// 服务断开了
		virtual void onDisconnected(const std::string& serviceName) = 0;
	};
	
	// 客户端
	class Client
	{	
	public:
		static Client* getInstance();
		
	public:
		// 设置客户端名称,让服务器知道是谁发过来的消息
		void setClientName(const std::string& name);
		
		// 如果多个服务复用一个服务器，设置了服务的服务器名称后就可以减少进程间的IPC连接
		void setServerNameForService(const std::string& serviceName, const std::string& serverName);
		
		// 设置服务连接监听器
		void setServiceConnectionListener(IServiceConnectionListener* listener);
	
		// 异步发送数据给服务器
		void post(Bundle& data);
		
		// 同步发送数据给服务器，并接收服务器的返回
		Bundle send(Bundle& data);
		
		// 监听服务器某id对应的数据
		void addServerObserverForId(const std::string id, IServerObserver* observer);
		
		// 不监听服务器某id对应的数据
		void removeServerObserverForId(const std::string id, IServerObserver* observer);
		
		// 基本封装
	public:
		// 异步发送基本类型
		void postInt8(const std::string& id, int8_t value);
		void postInt16(const std::string& id, int16_t value);
		void postInt32(const std::string& id, int32_t value);
		void postInt64(const std::string& id, int64_t value);
		void postFloat(const std::string& id, float value);
		void postDouble(const std::string& id, double value);
		void postString(const std::string& id, const std::string& value);
				
		// 异步发送基本类型数组
		void postInt8Vector(const std::string& id, const std::vector<int8_t>& value);
		void postInt16Vector(const std::string& id, const std::vector<int16_t>& value);
		void postInt32Vector(const std::string& id, const std::vector<int32_t>& value);
		void postInt64Vector(const std::string& id, const std::vector<int64_t>& value);
		void postFloatVector(const std::string& id, const std::vector<float>& value);
		void postDoubleVector(const std::string& id, const std::vector<double>& value);
		void postStringVector(const std::string& id, const std::vector<std::string>& value);
		
		// 异步发送基本类型数组(右值版本, 防止大规模变量拷贝)
		void postInt8Vector(const std::string& id, std::vector<int8_t>&& value);
		void postInt16Vector(const std::string& id, std::vector<int16_t>&& value);
		void postInt32Vector(const std::string& id, std::vector<int32_t>&& value);
		void postInt64Vector(const std::string& id, std::vector<int64_t>&& value);
		void postFloatVector(const std::string& id, std::vector<float>&& value);
		void postDoubleVector(const std::string& id, std::vector<double>&& value);
		void postStringVector(const std::string& id, std::vector<std::string>&& value);		
		
		// 同步发送基本类型
		Bundle sendInt8(const std::string& id, int8_t value);
		Bundle sendInt16(const std::string& id, int16_t value);
		Bundle sendInt32(const std::string& id, int32_t value);
		Bundle sendInt64(const std::string& id, int64_t value);
		Bundle sendFloat(const std::string& id, float value);
		Bundle sendDouble(const std::string& id, double value);
		Bundle sendString(const std::string& id, const std::string& value);
				
		// 同步发送基本类型数组
		Bundle sendInt8Vector(const std::string& id, const std::vector<int8_t>& value);
		Bundle sendInt16Vector(const std::string& id, const std::vector<int16_t>& value);
		Bundle sendInt32Vector(const std::string& id, const std::vector<int32_t>& value);
		Bundle sendInt64Vector(const std::string& id, const std::vector<int64_t>& value);
		Bundle sendFloatVector(const std::string& id, const std::vector<float>& value);
		Bundle sendDoubleVector(const std::string& id, const std::vector<double>& value);
		Bundle sendStringVector(const std::string& id, const std::vector<std::string>& value);
		
		// 同步发送基本类型数组(右值版本, 防止大规模变量拷贝)
		Bundle sendInt8Vector(const std::string& id, std::vector<int8_t>&& value);
		Bundle sendInt16Vector(const std::string& id, std::vector<int16_t>&& value);
		Bundle sendInt32Vector(const std::string& id, std::vector<int32_t>&& value);
		Bundle sendInt64Vector(const std::string& id, std::vector<int64_t>&& value);
		Bundle sendFloatVector(const std::string& id, std::vector<float>&& value);
		Bundle sendDoubleVector(const std::string& id, std::vector<double>&& value);
		Bundle sendStringVector(const std::string& id, std::vector<std::string>&& value);
	};
} // namespace ipc

#endif
